#pragma once

#include "iostream"
#include "vector"
#include "algorithm"
#include "unordered_map"
using namespace std;

/*HJJ QQ479287006
 *给你两个字符串 s1 和 s2 ，写一个函数来判断 s2 是否包含 s1 的排列。如果是，返回 true ；否则，返回 false 。

换句话说，s1 的排列之一是 s2 的 子串 。

 

示例 1：

输入：s1 = "ab" s2 = "eidbaooo"
输出：true
解释：s2 包含 s1 的排列之一 ("ba").
示例 2：

输入：s1= "ab" s2 = "eidboaoo"
输出：false

来源：力扣（LeetCode）
链接：https://leetcode.cn/problems/permutation-in-string
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
 * */
//这个 只需要计算 窗口区间的数量就行了 不需要计算排列问题
// 滑动窗口内的单词数量相同就行了
bool checkEqual(int s1Arr[], int temp[]) {

    for (int i = 0; i < 26; ++i) {
        if (s1Arr[i] != temp[i])
            return false;
    }

    return true;
}

bool checkInclusion(string s1, string s2) {
    if (s1.size() > s2.size())
        return false;
    int s1Arr[26] = {0};
    int temp[26] = {0};

    for (int i = 0; i < s1.size(); ++i) {
        ++s1Arr[(s1[i] - 'a')];
    }

    //构建窗口
    for (int i = 0; i < s1.size(); ++i) {
        ++temp[(s2[i] - 'a')];
    }

    int now = 0;//窗口头
    //i表示滑动窗口尾部
    for (int i = s1.size(); i < s2.size() && now < s2.size(); ++i) {
        if (checkEqual(s1Arr, temp))
            return true;

        //否则进行窗口滑动
        --temp[(s2[now++] - 'a')];
        ++temp[(s2[i] - 'a')];
    }

    return checkEqual(s1Arr, temp);

}